#include "FactoryConstante.h"


void FactoryConstante::FactoryConstantes(const std::string& s, AdaptorPile& context)throw(ParserException){
        Constante *c1,*c2;
        if(s.find('i') != string::npos)
                context.add(new Complexe());
        else if (s.find('.') != string::npos)
                context.add(new Reel(atof(s.c_str())));
        else if (s.find('\'') != string::npos)
                context.add(new Expression(s));
        else if(s == "+"){
                c1 = context.top();
                context.drop();
                c2 = context.top();
                context.drop();
                if(c1 == 0 || c2 == 0)
                        throw ParserException("2 Args required");
                context.add(Addition::apply(*c1,*c2));
        }
        else if(s == "-"){
                c1 = context.top();
                context.drop();
                c2 = context.top();
                context.drop();
                if(c1 == 0 || c2 == 0)
                        throw ParserException("2 Args required");
                context.add(Soustraction::apply(*c1,*c2));
        }
        else if(s == "*"){
                c1 = context.top();
                context.drop();
                c2 = context.top();
                context.drop();
                if(c1 == 0 || c2 == 0)
                        throw ParserException("2 Args required");
                context.add(Multiplcation::apply(*c1,*c2));
        }
        else if(s == "/"){
                c1 = context.top();
                context.drop();
                c2 = context.top();
                context.drop();
                if(c1 == 0 || c2 == 0)
                        throw ParserException("2 Args required");
                context.add(Division::apply(*c1,*c2));
        }
        else if(s == "EVAL"){
                c1 = context.top();
                context.drop();
                std::vector<string> v = Calculateur::parser(static_cast<Expression*>(c1)->getStr());
                for(int i=0;i<v.size();i++)
                        FactoryConstantes(v[i],context);
        }
        else if(s == "POW"){
                c1 = context.top();
                context.drop();
                c2 = context.top();
                context.drop();
                if(c1 == 0 || c2 == 0)
                        throw ParserException("2 Args required");
                cout<<c2<<endl;
                context.add(Pow::apply(*c2,*c1));
        }
        else if(s == "MOD"){
                c1 = context.top();
                context.drop();
                c2 = context.top();
                context.drop();
                context.add(static_cast<Entier*>(c2)->operator %(*static_cast<Entier*>(c1)));
        }
        else if(s == "!"){
                c1 = context.top();
                context.drop();
                context.add(static_cast<Entier*>(c1)->operator !());
        }
        else if(s == "SIGN"){
                c1 = context.top();
                context.drop();
                context.add(-(*c1));
        }
        else if(s == "SQR"){
                c1 = context.top();
                context.drop();
                context.add(Square::apply(*c1));
        }
        else if(s == "CUBE"){
                c1 = context.top();
                context.drop();
                context.add(Cube::apply(*c1));
        }
        else if(s == "INV"){
                c1 = context.top();
                context.drop();
                context.add(Inv::apply(*c1));
        }
        else if(s == "SQRT"){
                c1 = context.top();
                context.drop();
                context.add(Sqrt::apply(*c1));
        }
        else if(s == "SIN"){
                c1 = context.top();
                context.drop();
                context.add(Sin::apply(*c1));
        }
        else if(s == "SINH"){
                c1 = context.top();
                context.drop();
                context.add(Sinh::apply(*c1));
        }
        else if(s == "COS"){
                c1 = context.top();
                context.drop();
                context.add(Cos::apply(*c1));
        }
        else if(s == "COSH"){
                c1 = context.top();
                context.drop();
                context.add(Cosh::apply(*c1));
        }
        else if(s == "TAN"){
                c1 = context.top();
                context.drop();
                context.add(Tan::apply(*c1));
        }
        else if(s == "TANH"){
                c1 = context.top();
                context.drop();
                context.add(Tanh::apply(*c1));
        }
        else if(s == "LOG"){
                c1 = context.top();
                context.drop();
                context.add(Log::apply(*c1));
        }
        else if(s == "LN"){
                c1 = context.top();
                context.drop();
                context.add(Ln::apply(*c1));
        }
        else
                context.add(new Entier(atoi(s.c_str())));
}
